如同前篇文章所述
無論是寫了2000題還是寫500題,
leetcode contest rating才是和面試的coding表現較相關的數字
筆者個人認為(同一兩位高手看法)
如果能夠將leetcode contest rating穩定的維持2100分以上
那麼可以說以面試題目會出現的難度來說,各種主題的掌握度和完整度都已經不錯
(雖然對競賽仔而言2300+還是幼幼班呢...)
以台灣平均而言考最難的Google和字節的Coding面試部分而言,
2100分已經足以面對90%的題目了
比起繼續衝刺contest rating到2400,甚至2600
接下來建議比較需要投入時間的是
不要把某些寫leetcode contest的壞習慣帶到面試
(像是不管三七二十一先卯起來寫一個複雜度過不了的解答上去開始try and error)
學習一些跟leetcode分數無關的coding面試技巧/注意事項
想辦法在每個面試官會打分數的項目都不要被扣分(在往後的文章會提到)
確保常見的會考的topic真的刷熟了
(比賽的過程通常就自己會知道自己哪裡還不夠熟
不然Leetcode的Mock assesment也是幫助蠻大的
才是想要拿到offer最重要的
再來是這個階段開始如果還想要多熟悉面試難度的題目
可能會有一種leetcode題目都寫得差不多了的感覺
筆者相當推薦的一個Leetcode之外的題目集是
CSES problem set
其中
Range Queries/Geometry/Advanced Techniques
可能面試不太會考
但是其他類別都會有很多程式競賽的經典題
(有時候也會跟LC某些題目重複,看讀者能不能一眼就看出來)
而且這個網站的測資常常比leetcode更細膩一點
非常適合再更深度的自我挑戰
Google CSES problem editorial就可以找到幾乎每一題的題解
https://codeforces.com/blog/entry/83343
蠻適合Leetcode寫膩的時候來寫寫看的
另外是這個級別的讀者,應該要想辦法每週週賽都以完賽為目標
(雖然筆者也常常會撞牆寫不出來第四題)
但是想要維持2100的分數,還是要把握大家都寫得出來的那種第四題,
想辦法比別人寫得更快,前三題更要能一次到位不要有粗心的錯誤
如果時間很多,筆者個人寫到後來覺得leetcode contest
的一周四題/八題(其實Q1 Q2有點太簡單了Orz)的比賽頻率太低了
Codechef每周三晚上和AtCoder週六晚上也都會有熱騰騰的比賽,
除了後面兩三題真的蠻難或是需要很多先備數學知識的題目,
前幾題我覺得也都還蠻符合面試難度的,但筆者也只比過兩三個禮拜後來就面試結束了XDD
題外話,如果有神人從開始寫程式到2400+總共沒超過500題
那真的是天賦異稟
通常看到的leetcode題數沒有到500題的2400+高手也絕對是在
APCS NPSC CSES
Lucky貓ACM Uva USACO
TIOJ Codechef Atcoder Codeforce
TOI IOI ICPC或是各大題庫等等地方打滾寫了500+題(可以想像大部分題目都是leetcode hard+等級)
高手之所以是高手也絕對是因為他們投入了超級大量的時間
所謂一萬小時的法則
推薦的程式競賽科普文章 有事者·試競程
(來自超級超級強的卡卡恩學長)
“rating 2200 左右就正常有在用功的人該有的 rating 吧,
Google滿街競賽仔,有啥理由因此給更高 package ?”
- 來自某Google Code Jam台灣前40名的灣區現職Google工程師的善意提醒
建議有乖乖用功到2200+的讀者們也不要掉以輕心,
面試這種東西運氣成份還是佔非常非常大的,
還是有千百種機會被刷掉或是被挑骨頭的,
如果不是因為興趣,而是為了面試的coding繼續往2600+邁進
(就已經比筆者分數高了沒什麼好建議的XDD)筆者感覺是太過頭了
如果有時間除了上面的1.2.3.
也是還可以多丟幾間面試
多準備一些其他的東西像是英文口說或是問面試官的問題之類的東西比較好XD
可以參考補充文章:
Leetcode的weekly contest半小时AC 4题的那些人是怎么做到的
另外有個還蠻重要而且在比競賽的人都知道的小技巧叫做對拍
對筆者而言這個技巧有時候會用在:
1.你的code跟正解的code長的很像,但是在Leetcode的最後幾個超級大的測資上才會WA,嘗試縮小測資結果不會WA,很難debug
2.weekly contest時候寫的code沒什麼信心會過或是已經WA好幾次(其實通常對拍也沒用Orz)
其實說白了就是寫一個
function A(你的code)
跟
function B(either是別人的正確code,或者是複雜度比較高的暴力解但是正確的code)
然後自己再寫一個很簡單很陽春的random case generator,盡量產生比較小的測資
把function A和function B拿來run很多很多很多次,看看能不能賽到一個又小又可以WA的case,就可以用那個case去debug,常常會很輕鬆的找到code裡面的盲點
(筆者偷懶一下code就不放了因為用的到這個小技巧的讀者應該都知道以上敘述在講什麼XDDD)
最後,如果是比leetcode contest比到對競程很有興趣,可以再去加深加廣一坨拉庫面試幾乎不可能考,完全針對程式競賽特化的各種資料結構和演算法
簡單還算能理解的有: 後綴數組 sparse table
再來便是難懂到不行的什麼樹套樹什麼莫隊算法
一堆看解釋都看不懂的特化持久線段樹
引得眾人都哄笑起來:店內外充滿了快活的空氣。
這些因為真得完全超出面試難度範圍,除了讓人知道自己的渺小之外
(那些高中的資奧選訓營大神才花一兩年就已經完全比筆者現在的高度不知道高多少倍)
再去過多鑽研除了要花超級大量的時間之外,感覺對面試幫助有限,所以筆者就暫時止步了
筆者因為高中大學完全沒接觸過程式競賽,只有前陣子面試的時候順手查到了一些相關資源
就不班門弄斧了,以下附上參考文章Orz
CP-Algorithms
WiwiHo 的競程筆記
OI Wiki
A curated list of awesome Competitive Programming, Algorithm and Data Structure resources